/*
 This file is part of Musimage, a project which makes possible listen to music
 and, at the same time, watch pictures related with that music.
 Copyright (C) 2006  David Garcia Narbona 

 Musimage is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 Musimage is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with Musimage; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
package broker;

import java.util.ArrayList;

import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;

// Clase que modela el comportamiento que tendra el Agente broker
public class ServerBehaviour extends CyclicBehaviour {

	// Lista en la que se mantendran las peticiones que se estan precesando
	// actualmente
	private ArrayList clientRequestList = new ArrayList();

	public void action() {

		// Template para que solo este a la espera de mensajes del tipo
		// REQUEST
		MessageTemplate messaqeTemplate = MessageTemplate
				.MatchPerformative(ACLMessage.REQUEST);

		// Esta continuamente a la espera de peticiones de los clientes
		ACLMessage incomingMessage = myAgent.receive(messaqeTemplate);

		if (incomingMessage != null) {

			// Si llega un mensaje nuevo, sera el mensaje de un Agente cliente
			// del sistema. Se delegara en un comportamiento el encargado
			// de la gestion del servicio solicitado por el Agente cliente.

			// ** MIRAR SI ESTA ATENDIENDO LA PETICION **//
			if (!isClientRequestBeingProcessed(incomingMessage)) {

				clientRequestList.add(incomingMessage.getConversationId());
				myAgent.addBehaviour(new ProcessClientRequest(myAgent,
						incomingMessage));
			} else {

				sendAgree(incomingMessage);
			}
		} else {
			// Se realiza este bloqueo para que el comportamiento ciclico
			// no este consumiendo contiuamente CPU. Se desbloquea cuando
			// se cumpla la condicion del 'if', es decir, cuando llegue
			// un mensaje a la FIFO del Agente.
			block();
		}
	}

	// Verifica si la peticion esta siendo atendida
	private boolean isClientRequestBeingProcessed(ACLMessage incomingMessage) {

		if (clientRequestList.contains(incomingMessage.getConversationId())) {

			return true;
		} else {

			return false;
		}
	}

	// Envia mensaje AGREE conforme ya esta atendiendo esta peticion
	private void sendAgree(ACLMessage incomingMessage) {

		ACLMessage reply = incomingMessage.createReply();

		reply.setPerformative(ACLMessage.AGREE);

		myAgent.send(reply);
	}

	// ///////////////////////////////////////////////////////////
}